/**
 * Created by Administrator on 2018/11/18.
 */

;(function(win){
    // 1. 获取对象
    var Food = win.Food;
    var Snake = win.Snake;
    var DIRECTION = win.DIRECTION;

    // 2. 创建游戏的构造函数
    function Game(){
        this.food = new Food(); // 将食物的实体对象做为Game对象的属性值
        this.snake = new Snake();
        var map = document.querySelector(".map"); // 8,0 获取地图盒子

        // 5. 在构造函数中就调用一下
        this.init(map);

        // 6. 调用封装改变方向的函数
        this.bindKey();
    }

    // 3. 写游戏的原型对象上的方法,来调用某个实例对象的方法
    Game.prototype.init = function (map){
        // 在init这个方法里面,this指代当前Game创建出来的实例对象
        // var _this = this
        this.timerId =setInterval(function (){
            // 在定时器的函数当中this指向window
            // _this.snake.move()
            this.snake.move();

            //7. 让蛇吃食物
            // 获取蛇头对象
            var snakeHead = this.snake.body[0];
            // 判断蛇头坐标和食物坐标
            // console.log(snakeHead.x,this.food.x );
            if(snakeHead.x == this.food.x && snakeHead.y == this.food.y){
                // 坐标重合吃掉食物, 移除当前食物盒子
                this.food.removeFood();

                // 吃完食物,蛇要边长一个盒子的长度
                this.snake.growth();

                // 随机再生成一个食物盒子
                this.food = new Food();
                for(var i=0; i<this.snake.body.length; i++){
                    if(this.food.x == this.snake.body[i].x && this.food.y == this.snake.body[i].y){
                        this.food.removeFood();
                        this.food = new Food();
                        i = 0;
                    }
                }

            }

            //8. 边界碰撞检测
            //判断左右的边界
            if(snakeHead.x < 0 || snakeHead.x > map.clientWidth - this.food.width){
                alert("game over");
                clearInterval(this.timerId); // 清除定时器
            }
            //判断上下的边界
            if(snakeHead.y < 0 || snakeHead.y > map.clientHeight - this.food.height){
                alert("game over");
                clearInterval(this.timerId); // 清除定时器
            }

            //9. 碰撞自身检测
            for(var i=1; i< this.snake.body.length; i++){
                if(snakeHead.x == this.snake.body[i].x && snakeHead.y == this.snake.body[i].y){
                    alert("game over");
                    clearInterval(this.timerId); // 清除定时器
                }
            }
        }.bind(this),150);
    };

    Game.prototype.bindKey =function(){
        // 6. 设置蛇头移动的方向  // 左 37  上  38  右 39   下  40
        var _this = this;
        document.addEventListener("keydown",function (e){
            // alert(123)
            switch(e.keyCode){
                case 37:  // 左
                    if(_this.snake.direction != DIRECTION.RIGHT){ // 让蛇不能往回跑
                        _this.snake.direction = DIRECTION.LEFT;
                    }
                    break;
                case 38: // 上
                    // this.direction = 2;
                    if(_this.snake.direction != DIRECTION.BOTTOM){ // 让蛇不能往回跑
                        _this.snake.direction = DIRECTION.TOP;
                    }
                    break;
                case 39: // 右
                    if(_this.snake.direction != DIRECTION.LEFT){ // 让蛇不能往回跑
                        _this.snake.direction = DIRECTION.RIGHT;
                    }
                    break;
                case 40: // 下
                    if(_this.snake.direction != DIRECTION.TOP){ // 让蛇不能往回跑
                        _this.snake.direction = DIRECTION.BOTTOM;
                    }
                    break;
            }
        },false)
    };
    // 4. 将Game这个构造函数挂载到window上
    win.Game = Game
}(window));